#include <string.h>
#include <iostream>

using std::cout;
using std::endl;

//引用计数存在哪里呢？int cnt;
//1、栈区 error
//2、堆区 ok,放在堆区的那个位置呢
//3、全局静态区 error
//4、文字常量区 error
//5、程序代码区 error

//引用计数需要放在堆上面，理论上来说可以放在堆的任意位置，但是
//为了更方便得到引用计数，可以与数据放在一起，最好可以放在数据
//的前面，因为引用计数的长度是可以设定固定值，这样每次偏移指针
//的时候，就更加方便一些
class String
{
public:
    String();
    String(const char *pstr)
    : _pstr(new char[strlen(pstr) + 1] ())
    {

    }
    String(const String &rhs)
    /* : _cnt(rhs._cnt) */
    {
        /* ++rhs._cnt; */
    }
private:
    char *_pstr;
    /* int _cnt; */
};

void test()
{
    String s1("hello");//2
    String s2 = s1;

    String s3("world");//1
}

int main(int argc, char *argv[])
{
    test();
    return 0;
}

